Обратите внимание на тип возврата в определении approxCount
.
def countApprox(
timeout: Long,
confidence: Double = 0.95): PartialResult[BoundedDouble] = withScope {
Теперь обратите внимание на то, как он используется:
val waitSecs = 60
val cnt = inputDf.rdd.countApprox(waitSecs * 1000, 0.10).**getFinalValue**.mean
В соответствии с искровым scala doc, getFinalValue
- метод блокировки, который означает, что он будет ждать завершения полной операции.
В то время как initialValue
может быть выбран в течение указанного таймаута. Таким образом, следующий фрагмент не будет блокировать дальнейшие операции после таймаута,
val waitSecs = 60
val cnt = inputDf.rdd.countApprox(waitSecs * 1000, 0.10).initialValue.mean
Обратите внимание, что недостатком использования countApprox(timeout, confidence).initialValue
является то, что даже после получения значения он будет продолжать отсчет, пока он не получит окончательный счет, который вы
Теперь использование этого api не должно блокироваться при операции подсчета.
Теперь давайте подтвердим наше предположение о неблокирующей операции на spark2-shell. Давайте создадим случайный фрейм данных и выполним count
, approxCount
с getFinalValue
и approxCount
с помощью initialValue
:
scala> val schema = StructType((0 to 10).map(n => StructField(s"column_$n", StringType)))
schema: org.apache.spark.sql.types.StructType = StructType(StructField(column_0,StringType,true), StructField(column_1,StringType,true), StructField(column_2,StringType,true), StructField(column_3,StringType,true), StructField(column_4,StringType,true), StructField(column_5,StringType,true), StructField(column_6,StringType,true), StructField(column_7,StringType,true), StructField(column_8,StringType,true), StructField(column_9,StringType,true), StructField(column_10,StringType,true))
scala> val rows = spark.sparkContext.parallelize(Seq[Row](), 100).mapPartitions { _ => { Range(0, 100000).map(m => Row(schema.map(_ => Random.alphanumeric.filter(_.isLower).head.toString).toList: _*)).iterator } }
rows: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[1] at mapPartitions at :32
scala> val inputDf = spark.sqlContext.createDataFrame(rows, schema)
inputDf: org.apache.spark.sql.DataFrame = [column_0: string, column_1: string ... 9 more fields]
//Please note that cnt will be displayed only when all tasks are completed
scala> val cnt = inputDf.rdd.count
cnt: Long = 10000000
scala> val waitSecs = 60
waitSecs: Int = 60
//cntApproxFinal will be displayed only when all tasks are completed.
scala> val cntApprxFinal = inputDf.rdd.countApprox(waitSecs * 1000, 0.10).getFinalValue.mean
[Stage 1:======================================================> (98 + 2) / 100]cntApprxFinal: Double = 1.0E7
scala> val waitSecs = 60
waitSecs: Int = 60
//Please note that cntApprxInitila in this case, will be displayed exactly after timeout duration. In this case 80 tasks were completed within timeout and it displayed the value of variable. Even after displaying the variable value, it continued will all the remaining tasks
scala> val cntApprxInitial = inputDf.rdd.countApprox(waitSecs * 1000, 0.10).initialValue.mean
[Stage 2:============================================> (80 + 4) / 100]cntApprxInitial: Double = 1.0E7
[Stage 2:=======================================================>(99 + 1) / 100]
Давайте посмотрим на искру ui и искровую оболочку, все 3 операции в то же время:
cntApprxInitial
доступно до завершения всех задач.
Надеюсь, это поможет!
Теперь это:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<YourDbContext>(null);
base.OnModelCreating(modelBuilder);
}
в вашем файле YourDbContext.cs.
Ни одно из этих решений не будет работать для нас (кроме отключения проверки схемы вообще). В итоге у нас был пропущенный матч в нашей версии Newtonsoft.json
. Наш AppConfig не получил правильное обновление:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
</dependentAssembly>
Решение состояло в том, чтобы исправить версию сборки до тот, который мы фактически развертывали
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
Просто узнал ответ и подумал об обновлении здесь. Просто нужно сделать следующее.
public class AddressBook: DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.IncludeMetadataInDatabase = false;
}
}
Эта ошибка может указывать на проблему с вашей строкой подключения и соответствует ли ваше имя строки соединения декларации контекста базы данных.
У меня была эта ошибка, потому что я неправильно назвал локальную базу (глупая ошибка) и имя строки подключения в файле web.config «DefaultConnection» не соответствует MyDbContext, то есть
public MyDbContext(): base("DefaultConnection")
{}
<connectionStrings>
<add name="DefaultConnection" ...
</connectionStrings>
Для разработчиков VB.NET:
Добавьте следующую строку в файл Glabal.asax.vb, в конце метода Application_Start ()
Database.SetInitializer(Of ApplicationDbContext)(Nothing)
Измените ApplicationDbContext на ваш конкретный контекст Db.
Я использую метод Database.CompatibleWithModel (доступный в EF5) для проверки соответствия модели и базы данных, прежде чем использовать ее. Я вызываю этот метод сразу после создания контекста ...
// test the context to see if the model is out of sync with the db...
if (!MyContext.Database.CompatibleWithModel(true))
{
// delete the old version of the database...
if (File.Exists(databaseFileName))
File.Delete(databaseFileName);
MyContext.Database.Initialize(true);
// re-populate database
}
На всякий случай у кого-то есть тот же сценарий, что и мой.
У меня есть база данных сначала EF и в то же время с использованием идентификатора asp.net
, поэтому у меня есть два connectionStrings в мой webconfig, и с этим нет никаких проблем. Случилось так, что я создал / запустил скрипты для генерации вручную таблиц идентификаторов asp.net, которых я не должен.
, поэтому DROP сначала создайте все идентификационные таблицы asp.net, созданные вами вручную / из скриптов.
DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers
Или вы можете поместить эту строку в свой файл Global.asax.cs в разделе Application_Start ():
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());
Обязательно измените имя_проекта.Path.Context на свое пространство имен и контекст. Если сначала использовать код, это приведет к удалению и созданию новой базы данных всякий раз, когда будут внесены какие-либо изменения в схему.
У меня была та же проблема, когда мы использовали одну базу данных для двух приложений. Установка disableDatabaseInitialization="true"
в разделе типа контекста работает для меня.
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
<context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
</context>
</contexts>
Подробнее https://msdn.microsoft.com/en-us/data /jj556606.aspx
Хорошее предложение, однако, было настолько точным во всех случаях. Я все понял. Пожалуйста, вам нужно убедиться, что вы запускаете «enable-migrations» с использованием окон PM в Visual Studio, а папка миграции будет добавлена в ваш проект.
Убедитесь, что два файла класса c #, добавленные в папку на содержат все ваши модели и их соответствующие свойства.
Если у вас есть все, что создает решение, и публикация для развертывания.
Логика заключается в том, что существующие метаданные не могут быть перезаписаны, потому что ваше приложение не имеет метаданных для замены текущего. В результате вы получаете эту ошибку «Модель, поддерживающая контекст, изменилась с момента создания базы данных»
Это означает, что в контексте, который не был выполнен, произошли некоторые изменения. Сначала запустите Add-Migration, чтобы сгенерировать сделанные нами изменения (изменения, которые мы можем не знать), а затем запустить Update-Database
После некоторых исследований по этой теме я обнаружил, что ошибка возникает в основном, если у вас есть экземпляр db, созданный ранее на вашем локальном SQL-сервере express. Поэтому всякий раз, когда вы обновляете db и пытаетесь обновить db / run некоторый код на db, не выполнив команду Update Database
, используя Package Manager Console
; Прежде всего, вы должны удалить предыдущий db на нашем локальном SQL-Express вручную.
Кроме того, это решение работает, если у вас нет AutomaticMigrationsEnabled = false;
в вашей конфигурации.
Если вы работаете с системой управления версиями (git, svn и т. д.), а некоторые другие разработчики обновляют объекты db на этапе производства, эта ошибка возрастает всякий раз, когда вы обновляете свою базу кода и запускаете приложение.
Как указано выше, для кода на основе кода есть некоторые решения. Однако в некоторых случаях это наиболее практично.
Это исправление больше не работает после CTP5.
Вы должны сделать Database.SetInitializer<YourContext>(null);
Здесь я хочу поделиться другим методом, который предотвращает ошибку поддержки модели при изменении контекста:
1) Откройте файл DbContext
2) Добавьте пространство имен с помощью Microsoft.AspNet .Identity.EntityFramework;
3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (новый DropCreateDatabaseAlways ()); }
Я читаю также книгу Pro ASP.NET MVC 4, и столкнулся с той же проблемой, с которой вы столкнулись. Для меня у меня возникла проблема после внесения изменений, предписанных в разделе «Добавление модели валидации» в книге. Как я решил проблему, переместив мою базу данных с localdb на полномасштабный сервер SQL Server 2012. (Кстати, я знаю, что мне повезло, что я могу переключиться на полномасштабную версию, так что не ненавидите меня. ;-))) Должно быть что-то с сообщением с db, которое вызывает проблему.
Измените Global.asax.cs
, включая событие Application_Start
, с помощью:
Database.SetInitializer<YourDatabaseContext>(
new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
Создать пользовательский инициализатор контекста:
public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
public override void InitializeDatabase(MyDbContext context)
{
bool exists = context.Database.Exists();
base.InitializeDatabase(context);
if (!exists)
{
MyDbSeed.Seed(context);
}
}
}
Обратите внимание, что Migrations.Configuration - это класс, генерирующий командную строку миграции в консоли диспетчера пакетов. Вам может потребоваться изменить внутренний на публичный модификатор класса Migrations.Configuration.
И зарегистрировать его из своего OmModelCreating:
public partial class MyDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());
//other code for creating model
}
}
Вот некоторая информация из Блог пользователя Scott Gu's , опубликованный Jeff о том, что на самом деле происходит:
Для тех, кто видит это исключение :
«Модель, поддерживающая контекст« Производство », изменилась с момента создания базы данных. Либо вручную удалите / обновите базу данных, либо вызовите
Database.SetInitializer
с экземпляромIDatabaseInitializer
.»Вот что происходит и что с ним делать:
Когда модель сначала создается, мы запускаем DatabaseInitializer, чтобы делать что-то вроде создания базы данных, если ее нет или добавить данные семени. По умолчанию DatabaseInitializer пытается сравнить схему базы данных, необходимую для использования модели, с хешем схемы, хранящейся в таблице EdmMetadata, созданной с помощью базы данных (когда Code First является тем, который создает базу данных). Существующие базы данных не будут иметь таблицу EdmMetadata и поэтому не будут иметь хэш ... и реализация сегодня будет бросать, если эта таблица отсутствует. Мы будем работать над изменением этого поведения, прежде чем мы отправим версию fial, так как это значение по умолчанию. До тех пор существующие базы данных обычно не нуждаются в инициализаторе базы данных, поэтому его можно отключить для вашего типа контекста, вызвав:
Database.SetInitializer<YourDbContext>(null);
Jeff
blockquote>
У меня была та же проблема: повторное добавление миграции и обновление базы данных не работало, и ни один из вышеперечисленных ответов не был прав. Затем меня поразило вдохновение - я использую несколько уровней (одна сеть, одна информация и один бизнес). Уровень данных имеет контекст и все модели. Веб-слой никогда не выбрасывал это исключение - это был бизнес-уровень (который я установил как консольное приложение для тестирования и отладки). Оказывается, бизнес-уровень не использовал правильную строку подключения, чтобы получить db и сделать контекст. Поэтому я добавил строку подключения в конфигурацию приложения бизнес-уровня (и слоя данных) и альта, который он работает. Поместите это здесь для других, которые могут столкнуться с одной и той же проблемой.
Для меня с обновлением до 4.3.1 я просто обрезаю таблицу EdmMetaData или просто удаляю ее прямо.
Я провел много дней, чтобы решить эту проблему, проанализировал много разных сообщений и попробовал много вариантов и, наконец, исправил. Это два проекта в моем решении с использованием первых миграций EF-кода:
. Я получил эту ошибку при запросе WebApi .. .
Моя среда:
Здесь я собрал все замечания, на которые вы должны обратить внимание, и все условия / требования, которые должны быть выполнены, чтобы избежать упомянутого исключения:
<configuration>
<connectionStrings>
<add name="MyConnectionString" connectionString="...">
</connectionStrings>
<configuration>
должен быть равен параметру, переданному в конструкторе вашего DbContext: public partial class MyDbContext : DbContext
{
public MyDbContext()
: base("name=MyConnectionString"){}
...
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>());
...
Я попробовал очистить и перестроить решение, но это не помогло, чем я полностью удалил папки bin и obj из WebApi, удалил файлы базы данных из WebApi / App_Data, создал, перезапустил WebApi, сделал запрос к нему, создал правильную базу данных - ленивый инициализация (используя строки выше), что соответствует последней миграции и исключению, больше не отображается. Таким образом, это может решить вашу проблему: удалите вручную bin, obj-папки из вашего проекта запуска (который генерирует / обновляет вашу базу данных), создайте ваш проект запуска или лучше очистите и перестройте все ваше решение. воссоздайте базу данных, запустив проект (выполнив строки выше) или воспользуйтесь командой «Обновление-база данных» диспетчера пакетов. вручную проверьте, соответствует ли сгенерированный db и __MirgationHistory последнему сценарию миграции. Просто запустите следующую SQL-команду в SQL Server Management Studio:
delete FROM [dbo].[__MigrationHistory]
Попробуйте использовать Database SetInitializer, который принадлежит к использованию System.Data.Entity;
В Global.asax
protected void Application_Start()
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}
Это создаст новую базу данных каждый раз, когда ваша модель будет изменена. Но ваша база данных будет пустой. Чтобы заполнить ее фиктивными данными, вы можете использовать Seeding. Который вы можете реализовать как:
Посев ::
protected void Application_Start()
{
Database.SetInitializer(new AddressBookInitializer());
----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
protected override void Seed(AddressBook context)
{
context.yourmodel.Add(
{
});
base.Seed(context);
}
}
Проверьте следующие шаги
2.
У меня была эта проблема, и оказалось, что один проект указывал на SQLExpress, но тот, у кого проблема, указывал на LocalDb. (в их соответствующем web.config). Глупый надзор, но стоит отметить здесь, в случае, если кто-либо другой устранит эту проблему.
Для Entity Framework 5.0.0.0 - 6.1.3
Вы действительно хотите сделать следующее:
1. using System.Data.Entity; to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);
Да, Matt Frear верен. UPDATE -EDIT: Предостережение заключается в том, что я согласен с другими в том, что вместо добавления этого кода в global.asax добавлен в ваш класс DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// other code
Database.SetInitializer<YOURContext>(null);
// more code
}
. Как уже отмечалось, это хорошо для обработки модульного тестирования.
В настоящее время я использую это с Entity Framework 6.1.3 /.net 4.6.1
Странно, но все ответы здесь бесполезны для меня. Для меня работал инициализатор
MigrateDatabaseToLatestVersion
Вот мое решение (я знаю, это может быть намного проще, но я его использую):
class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}
public class MyDbContext: DbContext
{
public MyDbContext() : base("DbName")
{
SetInitializer();
}
public MyDbContext(string connString) : base(connString)
{
SetInitializer();
}
private static void SetInitializer()
{
if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
Database.SetInitializer(new MyDbInitializerForTesting());
else
Database.SetInitializer(new MyDbMigrateToLatest());
}
}
public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(MyDbContext context)
{
// Whatever
}
}
MyDbInitializerForTesting просто наследует от DropCreateDatabaseAlways, поэтому в каком-то конкретном случае (тестирование) вся база данных перестраивается. В противном случае он переносится в последнюю версию.
Мой источник: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific